# 类的创建
"""
class  类名字:  定义类的关键字        [类名字首字母要大写的]
    代码块
"""
# 什么都不包含，单纯的类
"""
class Person:       # 创建了一个人类
    pass
if __name__ == '__main__':      # 通篇py文件执行入口
    zhangsan = Person()     # zhangsan就是具体存在的对象，通过Person类创建的
"""
# 为类加一些对象属性
from faker import Faker
faker = Faker(locale='zh_cn')
class Person:
    cls = 'QC三期'        # 类属性
    def __init__(self,name,age,address):        # name、age、address是实例属性
        """
        __init__()：初始化方法。对象初始化的时候，需要对象传入参数
        :param self: 表示实例对象本身
        :param name: 实例对象名字
        :param age: 实例对象年龄
        :param address: 实例对象的住址
        """
        self.name = name        # self表示对象。对象的name是name
        self.age = age
        self.address = address
    def func(self):     # 类方法。类方法里面都会有self形参。表示对象可以调用的方法
        print(self) # <__main__.Person object at 0x0000014D25494FD0> 对象的内存地址，说明这个对象来自于Person类
        print(f"年龄：{self.age}，名字：{self.name}，地址：{self.address}")
    def get_name(self):
        """
        :return: 类里的方法，跟普通的函数也一样，也是可以有return返回值
        """
        return self.name





if __name__ == '__main__':
    # 通过Person创建p1对象。p1对象需要按照__init__初始化方法进行传参
    p1 = Person("张三",19,'沈阳')       # 有p1的对象，它的名字是张三，年龄19，地址沈阳
    p2 = Person("李四",22,'辽阳')
    # 通过对象，调用方法
    # p1.func()
    # p2.func()

    # 通过对象，调用类属性
    # print(p2.cls)
    # 通过类调用类属性
    # print(Person.cls)

    # 新增类属性
    """
    Person.play = "踢足球"
    print(Person.play)
    Person.aaa = 111
    print(Person.aaa)
    """

    # 可以使用实例去调用它
    # print(p2.aaa)

    # 如果实例属性与类属性重名
    """
    p2.aaa = "张三"
    print(p2.aaa)       # 优先级： 实例属性 > 类属性
    """

    # 查看实例有哪些属性呢？
    # print(p2.__dict__)      # {'name': '李四', 'age': 22, 'address': '辽阳', 'aaa': '张三'}

    # 查看类有哪些属性
    # print(Person.__dict__)

    # 修改实例属性；重新赋值
    """
    p2.name = faker.name()
    print(p2.name)
    print(p2.__dict__)
    """
    # 修改类属性；重新赋值
    """
    Person.cls = faker.name()
    print(Person.cls)
    """
    # 删除实例属性
    """
    del p2.aaa
    print(p2.aaa)   # 对象本身没有的，会去找类里有的类属性

    del p2.name
    print(p2.name)  # 会报错，找不到
    """

    # 删除类属性
    """
    del Person.cls
    print(Person.cls)   # 会找不到，报错
    """

    # 可以单独为对象增加实例属性
    """
    p1.play = "打篮球"
    print(p1.play)
    # 没给对象增加实例属性，直接打印会失败; 先定义后使用
    print(p2.play)  # AttributeError: 'Person' object has no attribute 'play'
    # 使用存在的实例属性
    print(p2.name)
    """

    # 调用get_name方法
    """
    name = p2.get_name()
    print(f"今天{name}去上学")
    """